package pruebas;

import java.util.Iterator;
import junit.framework.TestCase;
import negModel.*;
import negModelExcep.*;

public class AutoTest extends TestCase {

	ListaPartes l,l1,auxl;

	Aleron aleron,aleron1,ale;
	Carroceria carroc,carroc1;
	Combustible comb,comb1;
	Tanque tanque,tanque1;
	ControladorDeCombustible controlador,cont1;
	Escape escape,esc1;
	Llanta llanta,llan1;
	Neumatico neum,neum1; 
	Rueda rueda,rue1; 
	Motor m1,m2,motor1;
	Transmision t1,t2,trans1; 
	Parte p;
	Auto auto,auto1;
	
	protected void setUp() throws Exception {
		super.setUp();
		l = new ListaPartes();
		l1 = new ListaPartes();
		auxl = new ListaPartes();
		
		
		aleron = new Aleron(1000,15,5,new String("Aleron"),new AlgoPesos(100),true,5,5,8,10);
		ale = new Aleron(1000,15,5,new String("Aleron"),new AlgoPesos(100),true,5,5,8,10);
		carroc = new Carroceria (1000,500,3,new String("carr1"),new AlgoPesos(100),true,5,1,10,10,80,100);
		comb = new Combustible(88,88);
		tanque = new  Tanque(1000,50,new String ("tanque"),new AlgoPesos(100),true,100,1000,comb);
		tanque.cargarComb();
		controlador = new ControladorDeCombustible (1000,50,10,new String("Sistema de Inyeccion"),new AlgoPesos(100),true,10,7);
		escape = new Escape(1000,20,70,new String("escape"),new AlgoPesos(100),true,100,8);
		llanta = new Llanta (1000, 25,165,new String ("llanta1"),new AlgoPesos(100),false,10,0.05);
		neum = new Neumatico(1000,20,150,new String ("neum"),new AlgoPesos(100),false,10,100,10,3);
		rueda = new Rueda(llanta,neum,new String ("rueda1"),false);
		m1 = new Motor (1000,140,500,new String("Mot1"),new AlgoPesos(100),false,100,1000);
		m2 = new Motor (1000,140,500,new String("Mot1"),new AlgoPesos(100),false,100,1000);
		t1 = new Transmision(100,50,50,new String("trans"),new AlgoPesos(100),false,50,5,true);
		t2 = new Transmision(100,50,50,new String("trans"),new AlgoPesos(100),false,50,5,true);
		
		l.add(aleron);
		l.add(carroc);
		l.add(tanque);
		l.add(controlador);
		l.add(escape);
		l.add(rueda);
		l.add(m1);
		l.add(t1); auto = new Auto(l,"auto");
		
		aleron1 = new Aleron(1000,15,5,new String("Aleron tipo 1"),new AlgoPesos(100),true,5,4,8,10);
		carroc1 = new Carroceria (1000,500,3,new String("Carroceria pesada"),new AlgoPesos(1000),true,5,1,10,10,80,100);
		comb1 = new Combustible(88,1);
		tanque1 = new Tanque(1000,50,new String ("Tanque capacidad 1"),new AlgoPesos(100),true,100,1000,comb1);
		tanque1.cargarComb();
		cont1 = new ControladorDeCombustible (1000,50,10,new String("Sistema de Inyeccion 1 - porcentaje 70%"),new AlgoPesos(100),true,10,7);
		esc1 = new Escape(1000,20,70,new String("Escape 1 - eliminacion 70%"),new AlgoPesos(100),true,100,7);
		llan1 = new Llanta (1000,25,165,new String ("Llanta pesada"),new AlgoPesos(100),false,10,0.05);
		neum1 = new Neumatico(1000,20,150,new String ("Neumatico leve adhesion"),new AlgoPesos(100),false,10,100,10,3);
		rue1 = new Rueda(llan1,neum1,new String ("Rueda con "+ neum1.getDetalle()+" y "+ llan1.getDetalle()),false);
		trans1 = new Transmision(1000,50,50,new String("Transmision tipo 1 - cambios 5 - Manual"),new AlgoPesos(1000),false,50,5,true);
		motor1 = new Motor(1000,140,220,new String("Motor Citroen 1000 cc"),new AlgoPesos(1000),false,100,1000);
		
		l1.add(aleron1);
		l1.add(carroc1);
		l1.add(tanque1);
		l1.add(cont1);
		l1.add(esc1);
		l1.add(rue1);
		l1.add(trans1);
		l1.add(motor1); auto1 = new Auto(l1,"Citroen C4 GTI");
		
	}

	public void testAgregarParte() {
		assertEquals(m1,auto.agregarParte(m2));
		assertEquals(t1,auto.agregarParte(t2));
		assertEquals(aleron,auto.agregarParte(ale));
	}

	public void testSacarParte() {
		try{
			p = auto.sacarParte(carroc);
			p = auto.sacarParte(carroc);
			p = auto.sacarParte(m1);
			fail ("no se elevo la excepcion");
		}
		catch(eParteInexistente e){
		}
		catch(eParteNoRemovible e){
		}
					
	}
    //(==)&&
	
	public void testAvanzar(){
		auto.acelerar();
		assertEquals(30,m1.getRpm());
	}
		
	public void testMostrarPartes() {
		
		Iterator it = auto.iterator();
		
		while (it.hasNext())
			auxl.add((Parte)it.next());
		
		assertEquals(auxl,auto.mostrarPartes());
		
	}

	public void testSubirMarcha() {
		auto.subirMarcha();
		assertEquals(1,auto.mostrarEstadoDeTransmision(),0.0);
	}

	public void testBajarMarcha() {
		auto.bajarMarcha();
		assertEquals(0,auto.mostrarEstadoDeTransmision(),0.0);
		
	}
	
	public void testIterator(){
		Iterator it=auto.iterator();
		
		while (it.hasNext()){
			Parte p =(Parte)it.next();
			p.arreglar();
		}
	}

	public void testGetPerformance(){
		assertEquals(380,auto.getPerformance(),0);
	}
	
	public void testGetAerodinamia(){
		assertEquals(10,auto.getAerodinamia(),0);
	}
	
	public void testGetVelMaxima(){
		assertEquals(1041,auto.getVelMaxima(),0.0);
	}
	
	public void testGuardar() throws Exception{
		Auto.guardar("AutoDefault.xml", auto1);
	}
	
	public void testCargar() throws Exception{
		Auto auto2 = Auto.cargar("AutoDefault.xml");
		ListaPartes l2 = auto2.mostrarPartes();
		Aleron unaParte = (Aleron)l2.devolverParte(aleron1.getClass());
			assertEquals(unaParte.getLargo(),aleron1.getLargo(), 0);
			assertEquals(unaParte.getParteInferior(),aleron1.getParteInferior(),0);
			assertEquals(unaParte.getParteSuperior(),aleron1.getParteSuperior(),0);
			assertEquals(unaParte.getAerodinamia(),aleron1.getAerodinamia(),0);
			assertEquals(unaParte.aportevmax(),aleron1.aportevmax(),0);
			
		Carroceria unaParte2 = (Carroceria)l2.devolverParte(carroc1.getClass());
			assertEquals(unaParte2.getLargo(),carroc1.getLargo(),0);
			assertEquals(unaParte2.getAltoCabina(),carroc1.getAltoCabina(),0);
			assertEquals(unaParte2.getAltoFrente(),carroc1.getAltoFrente(),0);
			assertEquals(unaParte2.getAncho(),carroc1.getAncho(),0);
			assertEquals(unaParte2.getAerodinamia(),carroc1.getAerodinamia(),0);
			assertEquals(unaParte2.aportevmax(),carroc1.aportevmax(),0);
			
		Tanque unaParte3 = (Tanque)l2.devolverParte(tanque1.getClass());
			assertEquals(unaParte3.getCapacidad(),tanque1.getCapacidad(),0);
			assertEquals(unaParte3.getCantComb(),tanque1.getCantComb(),0);
			assertEquals(unaParte3.getPerformance(),tanque1.getPerformance(),0);
			assertEquals(unaParte3.aportevmax(),tanque1.aportevmax(),0);
			
		ControladorDeCombustible unaParte4 = (ControladorDeCombustible)l2.devolverParte(cont1.getClass());
			assertEquals(unaParte4.getPorcentajeInyec(),cont1.getPorcentajeInyec(),0);
			assertEquals(unaParte4.getPerformance(),cont1.getPerformance(),0);
			
		Escape unaParte5 = (Escape)l2.devolverParte(esc1.getClass());
			assertEquals(unaParte5.getPorcentajeElim(),esc1.getPorcentajeElim(),0);
			assertEquals(unaParte5.getPerformance(),esc1.getPerformance(),0);
			
		Rueda unaParte6 = (Rueda)l2.devolverParte(rue1.getClass());
			assertEquals(unaParte6.getCoeficiente(),rue1.getCoeficiente(),0);
			assertEquals(unaParte6.getSuperficie(),rue1.getSuperficie(),0);
			assertEquals(unaParte6.getPerformance(),rue1.getPerformance(),0);
			
		Transmision unaParte7 = (Transmision)l2.devolverParte(trans1.getClass());
			assertEquals(unaParte7.getMaxCambios(),trans1.getMaxCambios(),0);
			assertEquals(unaParte7.getCambio(),trans1.getCambio(),0);
			assertEquals(unaParte7.getPerformance(),trans1.getPerformance(),0);
			
		Motor unaParte8 = (Motor)l2.devolverParte(motor1.getClass());
			assertEquals(unaParte8.getRpmMax(),motor1.getRpmMax(),0);
			assertEquals(unaParte8.getPerformance(),motor1.getPerformance(),0);
			
	}
	
}
